#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include <assert.h>
using namespace std;

class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << this << endl;
	}

	~A()
	{
		cout << "~A():" << this << endl;
	}

private:
	int _a;
};

//int main()
//{
//	A* p1 = new A;
//
//	A* p2 = (A*)malloc(sizeof(A));
//	if (p2 == nullptr)
//	{
//		perror("malloc fail");
//	}
//	//new(p2)A;
//	new(p2)A(10);
//
//	return 0;
//}

/////////////////////////////////////////////////////////////////////////////////////

//void Swap(int& left, int& right)
//{
//	int temp = left;
//	left = right;
//	right = temp;
//}
//
//void Swap(double& left, double& right)
//{
//	double temp = left;
//	left = right;
//	right = temp;
//}
//
//void Swap(char& left, char& right)
//{
//	char temp = left;
//	left = right;
//	right = temp;
//}

// 泛型编程 -- 模板
// 模板参数(模板类型) -- 类似函数参数(参数对象)
// typename后面类型名字T是随便取，Ty、K、V，一般是大写字母或者单词首字母大写
// T 代表是一个模板类型(虚拟类型)
//template<typename T>  
//template<class T>
//void Swap(T& left, T& right)
//{
//	T tmp = left;
//	left = right;
//	right = tmp;
//}

//int main()
//{
//	int i = 1, j = 2;
//	double x = 1.1, y = 2.2;
//	Swap(i, j);
//	Swap(x, y);
//
//	char m = 'A', n = 'B';
//	Swap(m, n);
//
//	//map<string, string>::iterator it = dict.begin();
//	//auto it = dict.begin();
//
//	return 0;
//}

// 库里面
// https://cplusplus.com/reference/
// https://en.cppreference.com/w/  官方
// https://cplusplus.com/reference/utility/swap/?kw=swap
//int main()
//{
//	int i = 1, j = 2;
//	double x = 1.1, y = 2.2;
//	swap(i, j);
//	swap(x, y);
//
//	char m = 'A', n = 'B';
//	swap(m, n);
//
//	return 0;
//}

//int Add(const int& left, const int& right)
//{
//	return left + right;
//}

//template<class T>
//T Add(const T& left, const T& right)
//{
//	return left + right;
//}
//
//template<class T>
//T* Func(int n)
//{
//	T* a = new T[n];
//	return a;
//}
//
//// 休息到15：59继续
//int main()
//{
//	// Add(1.1, 2); // 推演实例化矛盾，报错
//
//	// 编译器自动推演，隐式实例化
//	cout << Add(1, 2) << endl;
//	cout << Add((int)1.1, 2) << endl;
//	cout << Add(1.1, (double)2) << endl;
//
//	// 显示实例化
//	cout << Add<int>(1.1, 2) << endl;
//	cout << Add<double>(1.1, 2) << endl;
//
//	// 必须显示实例化才能调用
//	Func<A>(10);
//
//	return 0;
//}


//template<class T>
//T Add(const T& left, const T& right)
//{
//	return left + right;
//}
//
//
//template<typename T1, typename T2>
//T1 Add(const T1& left, const T2& right)
//{
//	return left + right;
//}
//
//int main()
//{
//
//	// 编译器自动推演，隐式实例化
//	cout << Add(1, 2) << endl;
//	cout << Add(1.1, 2) << endl;
//	cout << Add(1, 2.2) << endl;
//
//	return 0;
//}

// 专门处理int的加法函数
//int Add(int left, int right)
//{
//	return left + right;
//}
//
//// 通用加法函数
//template<class T>
//T Add(T left, T right)
//{
//	return left + right;
//}
//
//// 通用加法函数
//template<class T1, class T2>
//T1 Add(T1 left, T2 right)
//{
//	return left + right;
//}
//
//int main()
//{
//	// 
//	cout << Add(1, 2) << endl;
//	cout << Add(1.1, 2.2) << endl;
//	cout << Add(1, 2.2) << endl;
//
//
//	return 0;
//}
///////////////////////////////////////////////////////////////////////
//typedef char STDataType;
//class Stack
//{
//private:
//	STDataType* _a;
//	int top;
//	int capacity;
//};
//
//class Stacki
//{
//private:
//	int* _a;
//	int top;
//	int capacity;
//};
//
//class Stackc
//{
//private:
//	char* _a;
//	int top;
//	int capacity;
//};
//
//int main()
//{
//	Stackc st1; // char
//	Stacki st2; // int
//
//	return 0;
//}

// 模板不支持分离编译。 声明放在.h  定义放在.cpp -- 原因：模板进阶再讲解
// 模板在同一个文件中，是可以声明和定义分离的
#include "Stack.h"

//int main()
//{
//	try
//	{
//		// 类模板都是显示实例化
//		// 虽然他们用了一个类模板，但是Stack<int>，Stack<char> 两个类型
//		//Stack<int> st1;
//		//Stack<char> st2;
//
//		//// 知道我要存100个数据，避免插入时扩容消耗
//		//Stack<int> st3(100);
//		//Stack<int> st4(0);
//
//		////Stack<Date> st4;
//
//		Stack<int> st1;
//		st1.Push(1);
//		st1.Push(2);
//		st1.Push(3);
//		st1.Push(4);
//		st1.Push(5);
//
//		//st1.Top()++;
//		//st1.Top() *= 2;
//
//		while (!st1.Empty())
//		{
//			cout << st1.Top() << " ";
//			st1.Pop();
//		}
//		cout << endl;
//
//		//Stack<> st2;
//	}
//	catch (const exception& e)
//	{
//		cout << e.what() << endl;
//	}
//
//	return 0;
//}
//

int main()
{
	char a1[] = "hello";
	char a2[] = "我草";

	//char a3[5] = { -79, -56, -52, -40, 0 };
	char a3[5] = { -50, -46, -78, -35, 0 };
	cout << a3 << endl;

	// 净网
	// 国粹词库
	// 同音字  

	/*a3[3]++;
	cout << a3 << endl;

	a3[3]++;
	cout << a3 << endl;

	a3[3]++;
	cout << a3 << endl;*/

	a3[1]--;
	a3[3]--;
	cout << a3 << endl;

	a3[1]--;
	a3[3]--;
	cout << a3 << endl;

	a3[1]--;
	a3[3]--;
	cout << a3 << endl;

	char ch = 'a';

	return 0;
}